﻿#Requires AutoHotkey v2.0

; 启用正则表达式
SetTitleMatchMode "RegEx"
; 全局变量
;; 用户软件目录
userApp := "D:\persist\lkatzey\lib\app.ms\"
bakConf := "D:\persist\lkatzey\bak\conf\"
; 使用 scoop 管理软件包
; scoop
SCOOP := "D:\persist\lkatzey\lib\app.ms\scoop\"
SCOOP_GLOBAL := SCOOP . "apps\"
SCOOP_BIN := SCOOP . "shims\"

; 判断 scoop 是否存在
if DirExist(SCOOP) {
	pm_scoop := true
} else {
	pm_scoop := false
}

; 环境变量
;; 设置 PATH 变量允许运行的文件
;;; PATHEXT += .AHK

; RIME
rime := A_ProgramFiles . "\Rime\"
Loop Files, rime "weasel*", "D" {
	rime := rime . A_LoopFileName . "\"
	break
}
rime_usr := bakConf . "rime\"


; 自提权
runAsAdmin() {
	full_command_line := DllCall("GetCommandLine", "str")

	if not (A_IsAdmin or RegExMatch(full_command_line, " /restart(?!\S)"))
	{
		try
		{
			if A_IsCompiled
				Run '*RunAs "' A_ScriptFullPath '" /restart'
			else
				Run '*RunAs "' A_AhkPath '" /restart "' A_ScriptFullPath '"'
		}
		ExitApp
	}
	; MsgBox "A_IsAdmin: " A_IsAdmin "`nCommand line: " full_command_line
}

; 读取应用信息
getAppInfo(appName, infoKey) {
	/*
	参数1必选：appinfo.ini中定义的应用名称
	参数2必选：appinfo.ini中定义的数据键
	appinfo.ini必须为ANSI编码，UTF-8有乱码风险
	
	返回值：如果查询到信息，则返回字符串；如果未查询到，则返回空值
	*/
	
	; 定义应用信息文件的路径
	filePath := A_ScriptDir "\appinfo.ini"
	
	; 检查文件是否存在
	if not FileExist(filePath) {
		return ""
	}
	
	; 读取指定应用的信息字段
	result := IniRead(filePath, appName, infoKey)
	
	return result
}

; 获取窗口内的比例坐标
getRelativePos(WinTitle, PercentX := "", PercentY := "") {
	/*
	参数1必选：WinTitle
	参数2可选：需要获取的X坐标的百分比，如50%就输入50
	参数3可选：需要获取的Y坐标的百分比，如50%就输入50
	
	返回值：如果3个参数都有，则返回数组，索引值从1开始
	*/
	
	; 获取指定窗口的大小
	WinGetPos ,, &Width, &Height, WinTitle

	if (PercentY = "") {
		RelativeX := Width * PercentX / 100
		; 返回X坐标
		return RelativeX
	} else if (PercentX = "") {
		; 计算相对Y坐标
		RelativeY := Height * PercentY / 100
		; 返回Y坐标
		return RelativeY
	} else {
		; 计算相对X坐标
		RelativeX := Width * PercentX / 100
		; 计算相对Y坐标
		RelativeY := Height * PercentY / 100
		; 返回数组
		return [RelativeX, RelativeY]
	}
}

; 剪贴板输入字符串
inputStr(str) {
	/*
	参数1必选：需要输入的字符串
	
	返回值：无
	*/
	
	; 先保存旧的剪贴板数据
	old_clip := ClipboardAll()
	; 将要写入的文本写入到剪贴板内
	A_Clipboard := str
	; 发送剪贴板数据
	Sleep 300
	SendEvent "^v"
	; 等待Ctrl+V被处理后恢复剪贴板数据
	Sleep 500
	A_Clipboard := old_clip
}

; 判断应用程序目录是否存在
findAppPath(dirname) {
	/*
	参数1必选：要查找的目录名称
	
	返回值：若查找到目录，则返回路径；找不到则返回空值
	*/
	
	; 应用程序目录
	programFiles := EnvGet("ProgramFiles") . "\"
	programFilesx86 := EnvGet("ProgramFiles(x86)") . "\"
	appDataRoaming := EnvGet("HOME") . "\AppData\Roaming\"
	appDataLocal := EnvGet("HOME") . "\AppData\Local\"
	userAppDir := userApp
	
	; 检查所有可能的位置
	for path in [userAppDir, programFiles, programFilesx86, appDataRoaming, appDataLocal] {
		fullPath := path . dirname . "\"
		; 检查是否存在该目录
		if FileExist(fullPath) {
			return fullPath
		}
	}
	
	; 若未找到则返回空值
	return ""
}
